debugger;
function Foo() {
  getName = function () {
    console.log(1);
  };
  return this;
}

Foo.getName = function () {
  console.log(2);
};
Foo.prototype.getName = function () {
  console.log(3);
};
var getName = function () {
  console.log(4);
};
function getName() {
  console.log(5);
}
Foo.getName(); // 2
getName(); // 4

/** 此时是作为普通函数执行 这里的this是window or undefined
 *  如果是window 那么即为window.getName()
 *  如果是undefined 就会报错
 * */
Foo().getName(); // 1


/** 因为上面Foo()执行时 改变了window.getName
 * 故↓*/
getName(); // 1

/** 运算符优先级 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Operator_Precedence*/
//new 无参构造(即直接 new X),new优先级是低于 .成员访问 的优先级的
new Foo.getName(); // 2

//new 有参构造(即new X()),new优先级 和 .成员访问 优先级一样
//优先级一样就要看
//运算符是否相同
//  + 相同:
//  这就要看运算符的associativity了
//  Left-associativity (left-to-right) means that it is processed as (a OP b) OP c
//  , while right-associativity (right-to-left) means it is interpreted as a OP (b OP c)
//  + 不相同:
//  这里是两个不同的运算符,从左往右执行
new Foo().getName(); // 3
/* 等同于 (new Foo()).getName();
因为两个运算符优先级等同
此时看associativity
有参构造的 associativity 为n/a 表示没有关联性
emm so 我们直接看 . 的associativity,为left-to-right
故↑等同于 (new Foo()).getName();
*/

//new
new new Foo().getName(); // 3
/*
1.new Foo实例.getName()
//此时↑因为 new 是不带惨的 优先级低于 .访问符
//故↓
2.new (Foo.prototype.getName)() // 有参构造

虽然MDN里只说了无参构造的 associativity 为right-to-left(有参构造为 N/A)
但从实验结果来看,只要是new连用,那就是按照right-to-left
*/

/**
new Fn() 是会当做一个有参构造的

而不是 new (Fn())

构造函数就是这样定义的
*/
